import random
import pygame
from game_items import *
from game_hud import *
from game_music import *
class Game(object):
    """游戏类"""
    def __init__(self):
        # 游戏主窗口
        self.main_window = pygame.display.set_mode(SCREEN_RECT.size)
        pygame.display.set_caption("飞机大战")
        # 游戏状态属性
        self.is_game_over = False      #游戏结束标记
        self.is_pause = False          #游戏暂停标记
        # 精灵组属性
        self.all_group = pygame.sprite.Group()          # 所有精灵组
        self.enemies_group = pygame.sprite.Group()      # 敌机精灵组
        self.supplies_group = pygame.sprite.Group()     # 道具精灵组
        # 创建精灵
        # 背景精灵，交替滚动
        self.all_group.add(Background(False), Background(True))
        # 英雄精灵,静止不动
        self.hero = Plane(1000, 5, 0, "me_down.wav",
                         ["me%d.png" % i for i in range(1, 3)],
                         "me1.png", ["me_destory_%d.png" % i for i  in range(1,5)],
                          self.all_group)
        self.hero.rect.center = SCREEN_RECT.center  #显示在屏幕中央
        # 指示器面板
        self.hud_panel = HUdPanel(self.all_group)
        # 背景精灵，向下方移动
        GameSprite("background.png", 1, self.all_group)
        # 创建敌机
        self.create_enemies()
        
    def reset_game(self):
        """重置游戏"""
        self.is_game_over = False
        self.is_pause = False
        self.hud_panel.reset_panel()            # 重置指示器面板

def create_enemies(self):
        """根据游戏级别创建不同数量的敌机"""
        # 敌机精灵组中的精灵数量
        count = len(self.enemies_group.sprites())
        # 要添加到的精灵组
        groups = (self.all_group, self.enemies_group)
        # 判断关卡级别及已有的敌机数量
        if self.hud_panel.level == 1 and count == 0:        # 关卡级别 1
            for i in range(16):
                Enemy(0, 3, *groups)
        elif self.hud_panel.level == 2 and count == 16:     # 关卡级别 2
            # 增加敌机的最大速度
            for enemy in self.enemies_group.sprites():
                enemy.max_speed = 5
            # 创建敌机
            for i in range(8):
                Enemy(0, 5, *groups)
            for i in range(2):
                Enemy(1, 1, *groups)
        elif self.hud_panel.level == 3 and count == 26:     # 关卡级别 3
            # 提高敌机的最大速度
            for enemy in self.enemies_group.sprites():
                enemy.max_speed = 7 if enemy.kind == 0 else 3
            # 创建敌机
            for i in range(8):
                Enemy(0, 7, *groups)
            for i in range(2):
                Enemy(1, 3, *groups)
            for i in range(2):
                Enemy(2, 1, *groups)

def event_handler(self):
    """事件监听
    :return:如果监听到退出事件,返回True,否则返回False
    """
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            return True
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            return True
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                if self.is_game_over:           # 游戏已经结束
                    self.reset_game()           # 重新开始游戏
                else:                           # 切换暂停状态
                    self.is_pause = not self.is_pause
        # 判断是否正在游戏
        if not self.is_game_over and not self.is_pause:
            # 监听玩家按下字母b，引爆1颗炸弹
                if event.type == pygame.KEYDOWN and event.key == pygame.K_b:
                    # TODO测试炸毁所有敌机
                    for enemy in self.enemies_group.sprites():
                        enemy.hp = 0
                # else:
                #     # 测试修改游戏得分
                #     if self.hud_panel.increase_score(100):
                #         print("升级到 %d" % self.hud_panel.level)
                #     # 更新all_group中所有精灵内容
                #     self.all_group.update()
    return False

def start(self):
        """开始游戏"""
        clock = pygame.time.Clock()             #游戏时钟
        frame_counter = 0                       # 逐帧动画计数器
        while True:                             #开始游戏循环
            # 生命计数等于 0，表示游戏结束
            self.is_game_over = self.hud_panel.lives_count == 0
            if self.event_handler():            #事件监听
                self.hud_panel.save_best_score()
                return
             # 判断游戏状态
            if self.is_game_over:
                self.hud_panel.panel_pause(True, self.all_group)
            elif self.is_pause:
                self.hud_panel.panel_pause(False, self.all_group)
            else:
                self.hud_panel.panel_resume(self.all_group)
                # # TODO 测试修改游戏得分
                # if self.hud_panel.increase_score(100):
                #     print("升级到 %d" % self.hud_panel.level)
                #     self.create_enemies()
                # 修改逐帧动画计数器
                frame_counter = (frame_counter + 1) % FRAME_INTERVAL
                # 更新 all_group 中所有精灵内容
                self.all_group.update(frame_counter == 0)
        
            pygame.display.update()             #更新显示
            clock.tick(60)                      #设置刷新帧率
if __name__ == '__main__':
    pygame.init()
    Game().start()
    pygame.quit()
